FP8 Training Recipes, Performance and Convergence

Xin Yao, DevTech | AI Open Day/May 30, 2025

目录

  1. FP8 混合精度训练概述
  2. FP8 训练方案 (Training Recipes
  3. FP8 训练性能
  4. FP8 训练收敛性
  5. 致谢

FP8 混合精度训练概述

为什么使用 FP8?

FP8 格式

Page 5
Page 5

参考链接:https://www.opencompute.org/documents/ocp-8-bit-floating-point-specification-ofp8-revision-1-0-2023-12-01-pdf-1

BF16 混合精度训练

下图展示了标准的 BF16 混合精度训练流程,其中权重更新在 FP32 中进行以保持精度。

Page 6
Page 6

BF16 混合精度 + FP8

在 BF16 混合精度训练的基础上引入 FP8,以进一步加速计算密集型的 GEMM 操作。

Page 7
Page 7

FP8 训练方案 (Training Recipes)

缩放 (Scaling)

Page 9
Page 9

FP8 方案概览 (FP8 Recipes Overview)

什么是 FP8 方案?

Figure from Insights into DeepSeek-V3: Scaling Challenges and Reflections on Hardware for AI Architectures. https://arxiv.org/pdf/2505.09343v1
Figure from Insights into DeepSeek-V3: Scaling Challenges and Reflections on Hardware for AI Architectures. https://arxiv.org/pdf/2505.09343v1

按张量缩放 (Per-Tensor Scaling)

延迟缩放 (Delayed) 与 当前缩放 (Current)

Page 11
Page 11
with fp8_autocast(fp8_recipe=Float8CurrentScaling()):
    model()
--fp8-format hybrid
--fp8-recipe tensorwise

按张量缩放:Hopper 架构

Page 12
Page 12

按张量缩放:Blackwell 架构

Page 13
Page 13

分块缩放 (Blockwise Scaling)

Groupwise/Sub-channel

Page 14
Page 14
with fp8_autocast(fp8_recipe=Float8BlockScaling()):
    model()

--fp8-format e4m3 --fp8-recipe blockwise

分块缩放:Hopper 架构

Page 15
Page 15

MXFP8 (仅限 Blackwell 架构)

MXFP8 是 OCP (Open Compute Project) 的微缩放格式 (Microscaling Formats) 之一,专为 Blackwell 架构设计。

下图展示了 MXFP8 的数据结构,其中 k 个标量元素共享一个缩放因子 X。每个元素 P_id 个比特。表格总结了 MXFP8 的格式细节。

Page 16
Page 16

MXFP8 训练流程

在仅支持 Blackwell 架构的 MXFP8 训练中,激活值和权重在前向和后向传播中以不同方式进行量化。这要求数据同时支持行优先(rowwise)和列优先(colwise)的格式。

下图详细描述了 MXFP8 在前向传播、后向传播和优化器更新过程中的数据流:

Page 17
Page 17

FP8 存储:FP8 激活与 FP8 主权重

为了优化内存使用,可以调整 FP8 的存储策略。

一个核心问题是:我们能否只保留 FP8 权重,以进一步节省内存?

下图展示了此存储策略下的数据流,其中虚线框部分不被存储。

Page 18
Page 18

FP8 存储:FP8 主权重所面临的挑战

仅存储 FP8 主权重会带来一些挑战,尤其是在与 MCore 的分布式优化器(如 ZeRO-1)和分布式检查点(checkpoint)协同工作时。

以下是跨 DP Rank(数据并行等级)同步权重的流程:

  1. 步骤 1: 优化器(optimizer.step())更新各 DP Rank 上的 FP32 主权重(master weights)。
  2. 步骤 2: 从更新后的主权重中计算局部 amax 值(absolute maximum,绝对值最大值)。
  3. 步骤 3: 通过 AllReduce max 操作,在所有 DP Rank 间同步,得到全局 amax 值。

下图详细描绘了在 DP=2,Rank 0 和 Rank 1 之间的这个同步过程。

Page 19
Page 19

FP8 存储:FP8 主权重更新流程

在获取全局 amax 值之后,流程继续进行:

  1. 步骤 4: 将全局 amax 值和 FP32 主权重一起转换为 FP8 格式的模型权重(model weights)。
  2. 步骤 5: 在所有 DP Rank 间使用 AllGather 操作分发 FP8 格式的模型权重。

此流程需要为每种 FP8 配方(recipe)进行单独的实现。在 MCore (v0.12 及更高版本) 中,可以通过 --fp8-param-gather 参数来启用此功能。

下图展示了从全局 amax 到最终 FP8 模型权重的转换和分发过程。

Page 20
Page 20

FP8 存储:内存占用概览

下表总结了不同训练精度和存储策略下的内存占用情况,此分析不包括激活值所占用的内存,这部分内存在 MoE 模型中尤为重要。

Page 21
Page 21

从表中可以看出,使用 FP8 主权重(FP8 Primary Weights)可以显著减少内存占用,尤其是在 ZeRO-1 优化下(对比 BF16 的 6+10/d,FP8 Primary Weights 在 Blackwell 上可以达到 5+12/d)。

FP8 通信:非归约(Non-reduction)通信

下图对比了 split_overlap_rsatomic_gemm_overlap_rs (atomic) 两种方式。atomic_gemm 通过将多个小 GEMM 操作合并为一个原子操作,并使用计数器进行同步,减少了计算流(compute stream)和通信流(comm stream)之间的等待事件,从而改善了计算和通信的重叠效率。

Page 23
Page 23

下图展示了 FP8 A2A(All-to-All)的数据流:
Quantize into FP8 → FP8 A2A → FP8 Permute → [GroupedGEMM, BF16 output]

Page 24
Page 24

FP8 训练性能

FP8 训练加速:Llama 3 系列/Nemotron/Mixtral

下图展示了在不同硬件平台(GB200, B200, H100)上,使用 FP8-CS (常规缩放) 和 FP8-MX (微缩放) 相对于 BF16 的训练加速比。

Page 26
Page 26

FP8 训练加速:DeepSeek-V3

下表展示了 DeepSeek-V3 训练的详细配置和性能数据:

Page 27
Page 27

FP8 训练加速:展望

未来的性能优化方向包括:

下图的性能剖析图显示,在路由(router)层有“过多的 kernels”(Too many kernels),导致了显著的 TP2 开销和 TE 开销,凸显了 Kernel 融合的必要性。

Page 28
Page 28

FP8 训练收敛性

验收标准

下图比较了 BF16 和 FP8 训练的损失曲线。结果使用系数为 0.9 的指数移动平均(EMA)进行了平滑处理。从图中可以看出,FP8 的损失曲线与 BF16 高度吻合,表明其具有良好的收敛性。

Figure 10 | Loss curves comparison between BF16 and FP8 training. Results are smoothed by Exponential Moving Average (EMA) with a coefficient of 0.9. (Page 30)
Figure 10 | Loss curves comparison between BF16 and FP8 training. Results are smoothed by Exponential Moving Average (EMA) with a coefficient of 0.9. (Page 30)

图表来源:DeepSeek-V3 技术报告。

下图展示了在 MMLU 和平均常识理解任务上,FP8 与 BF16 的训练收敛情况对比。结果显示,两种精度格式下的模型准确率曲线非常接近。

Page 31 - FP8 与 BF16 在 MMLU 和平均常识理解任务上的收敛曲线对比
Page 31 - FP8 与 BF16 在 MMLU 和平均常识理解任务上的收敛曲线对比

下图展示了在 MMLU 和平均常识理解任务上,BF16 与 FP8 的进一步比较,图中还区分了 "Per-tensor current scaling" 和 "Blockwise scaling" 两种缩放方式。实验结果表明,FP8 和 BF16 的性能表现依然非常接近。

Page 32 - BF16 与 FP8 在不同缩放方式下的收敛曲线对比
Page 32 - BF16 与 FP8 在不同缩放方式下的收敛曲线对比

致谢

Page 33 - 致谢页面
Page 33 - 致谢页面